const Readable = require('stream').Readable

class ToReadable extends Readable {
  constructor (iterator) {
    super()
    this.iterator = iterator
  }

  _read () {
    const res = this.iterator.next()

    if (res.done) {
      // console.log(this)
      // 迭代结束，结束可读流
      this.push(null)
    } else {
      // 将数据添加到流
      this.push(res.value + '\n')
    }
  }
}

const gen = function * (a) {
  let count = 5
  let res = a

  while (count--) {
    res = res * res
    yield res
  }
}

const readable = new ToReadable(gen(2))

// 可以使用事件的方式
// 监听data事件
readable.on('data', data => process.stdout.write(data))

// 监听end事件
readable.on('end', () => process.stdout.write('read stream end!'))

// 也可以使用pipe
// readable.pipe(process.stdout)
